<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<button>点击</button>
		<button>点击</button>
		<button>点击</button>
		<script>
			// 函数的定义方式:
			// 1.函数声明关键字function(命名函数)
			// 		   function fn(){}	
			// 2.函数表达式(匿名函数)		
			//         var f = function(){}
			// 3.利用new Function('参数1','参数2','函数体')	
			var f = new Function('a', 'b', 'console.log(a + b)');//3
			f(1, 2);
			// 4.所有函数都是Function的实例(对象)	   
			console.dir(f);
			// 5.函数也属于对象		  
			console.log(f instanceof Object);//true
			
			// this指向call方法，借用构造函数继承父类属性方法
			// this指向apply方法
			// 可以调用函数,可以改变this指向,参数必须是数组(伪数组)
			var o = {
				name: 'andy',
			}
			function fn(arr) {
				console.log(this);
				console.log(arr);
			}
			fn.apply(o, ['pink']);
			var arr2 = [1, 52, 3, 62, 54, 99];
			
			var max = Math.max.apply(Math, arr2);
			var min = Math.min.apply(Math, arr2);
			console.log(max); //99
			console.log(min); //1
			
			// this指向bind方法
			// 不会调用原来的函数,可以改变原来函数内部的this的指向
			// 返回的是原函数改变this之后产生的新函数
			var m = {
				name: 'andy',
			}
			function fn2(a, b) {
				console.log(this);
				console.log(a + b);
			}
			var f2 = fn2.bind(m, 1, 2);
			f2();
			
			// 使用方法:如果有的函数不需要立即调用,只需要改变this指向	
			var btns = document.querySelectorAll('button');
			for (var i = 0; i < btns.length; i++) {
				btns[i].onclick = function() {
					this.disabled = true;
					setTimeout(function() {//定时器里面的this指向的是window
						this.disabled = false;
					}.bind(this), 2000);//使用bind方法，此时this指向btns[i]对象
				}
			}
			// 总结: call、apply、bind	
			// 相同点:都可以改变函数内部的this指向
			// 不同点:
			//1.call和apply都会调用函数,改变函数内部this指向
			//2.call和apply传递的参数不一样,call传递参数形式,arg1、arg2,apply必须是数组的形式[arg]
			// 3.bind不会调用函数,但会改变函数内部this指向
		</script>
	</body>
</html>
